跳到主要内容

于 2019 年 6 月发布的 ECMAScript 2019 (简称 ES10),在增强现有 API 功能修复历史问题提升开发便捷性 三个方向新增了实用特性。

一、 Array.prototype.flat()Array.prototype.flatMap()

解决嵌套数组的扁平化处理,避免手动递归或多程序循环

1. flat(depth)

将嵌套数组扁平化,参数 depth 指定扁平化的深度(默认值为 1),返回新的数组(不改变原数组)。

const arr = [1, [2, [3, 4]]];

arr.flat(); // [1,2,[3,[4]]];
arr.flat(2); // [1,2,3,[4]];
arr.flat(3); // [1,2,3,4];
信息

特殊处理:会自动过滤数组中的空元素 ([1, 3].flat(); // [1, 3]

2. flatMap(callback)

相当于 map() 后调用 flat(1),但性能更优(一次遍历完成)。适用于“映射后需要浅度扁平化”的场景。

const arr = ['hello earthnut', 'Love my China'];

arr.flatMap(words => words.split(' '));
// ['hello', 'earthnut', 'Love', 'my', 'China']

二、 String.prototype.trimStart()String.prototype.trimEnd()

补充 trim() 的功能,支持单独去除字符串开头/结尾空白字符(空格、制表符、换行符)。

  • trimStart():去除字符串开头的空白
  • trimEnd():去除字符串结尾的空白

三、 Object.formEntries()

最为 Object.entries() 的逆操作,将“键值对数组”转换为对象,简化数据格式转换。

// 从键值对数组创建对象
const entries = [
['name', 'ES10'],
['year', 2019],
];
Object.fromEntries(entries); // { name: 'ES10', year: 2019 }

// 处理Map转对象(Map的entries()返回键值对迭代器)
const map = new Map([
['a', 1],
['b', 2],
]);
Object.fromEntries(map); // { a: 1, b: 2 }

// 处理对象过滤/转换
const obj = { a: 1, b: 2, c: 3 };
const filtered = Object.entries(obj)
.filter(([k, v]) => v > 1)
.map(([k, v]) => [k, v * 2]);
Object.fromEntries(filtered); // { b: 4, c: 6 }

四、 可选的 Catch 绑定

解决了不需要 catch 块的错误参数时,允许省略参数,简化代码

try {
JSON.parse('invalid');
} catch {
// 无需参数
console.log('解析失败');
}

五、 Symbol.prototype.description

方便获取创建 Symbol 时的描述字符串,避免通过 toString() 简介提取。

const sym = Symbol('这是一个Symbol');

sym.toString(); // "Symbol(这是一个Symbol)"(需截取)
sym.description; // "这是一个Symbol"(直接获取)

// 无描述时返回undefined
Symbol().description; // undefined

六、 Function.prototype.toString() 改进

toString() 返回函数的完整源代码(包括注释、空格、参数默认值等),更符合直觉。

ES10 前,toString()可能省略函数体中的注释或简化格式;ES10 要求精确返回函数的原始代码(除了环境相关的细节,如绑定的 this)。

信息

好像在 ES7 中见过 Function.prototype.toString() 的改进

七、 Array.prototype.sort() 稳定性优化

规范 sort()的稳定性,确保排序后 “相等元素” 的相对顺序保持不变。

信息

好像在 ES7 中见过 Array.prototype.sort() 的稳定性提升

八、 JSON 超集支持

信息

好像在 ES9 中见过 JSON 的 超集支持

九、 规范了 JSON.stringify()

确保 JSON.stringify() 输出“符合标准的 JSON 字符串”,避免因为“孤立代理项”导致的无效 JSON。

Unicode 中,“代理项对”(如\uD83D\uDE00 表示 😀)是合法字符,但单个代理项(如\uD83D)是无效的。ES10 前,JSON.stringify()会将孤立代理项转为 �(替换字符),导致 JSON 无效;ES10 会将其转为对应的 Unicode 转义序列(如\ud83d),确保输出合法。

// 孤立代理项\uD83D
JSON.stringify('\uD83D');

// ES10前:"�"(无效JSON)
// ES10后:"\ud83d"(有效JSON,可被正确解析)

十、 JSON.stringify()Symbol 的处理

修复了 JSON.stringify()Symbol 类型的处理。

信息
  • 之前 JSON.stringify() 会将 Symbol 转化为 null
  • 现在会忽略 Symbol 类型的值
const obj = { a: 1, b: Symbol('test') };

// '{"a": 1}'
console.log(JSON.stringify(obj));